home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / dev / c / AmiVoGL_MDEV.lha / drivers / ps.c < prev    next >
C/C++ Source or Header  |  1994-04-12  |  10KB  |  673 lines

  1.  
  2. #undef VOGLE
  3. /*
  4.  * The next bit is site and UNIX specific...
  5.  */
  6. #undef LASERWRITER
  7.  
  8. /*
  9.  * Some more bug fixes from  ralf@physik3.gwdg.de (Ralf Fassel)
  10.  * regarding %%Pages and devname .... 28/03/94
  11.  */
  12.  
  13. #include <stdio.h>
  14. #ifdef VOGLE
  15. #include "vogle.h"
  16. #else
  17. #include "vogl.h"
  18. #endif
  19.  
  20. typedef struct {
  21.     float    r, g, b;
  22. } Coltab;
  23.  
  24. static Coltab    *coltab;
  25. extern char    *vallocate();
  26.  
  27. extern FILE    *_voutfile();
  28.  
  29. static int    ps_first_time = 1, drawn = 0,
  30.         curcol = 0,            /* black */
  31.         pslstx = -1, pslsty = -1,    /* last (x, y) drawn */
  32.         colour = 0, page;
  33.  
  34. /*
  35.  * gray scale map for our standard colours
  36.  */
  37. static float    graymap[8] = {
  38.             0.0,
  39.             0.30,
  40.             0.59,
  41.             0.89,
  42.             0.11,
  43.             0.41,
  44.             0.70,
  45.             0.99
  46. };
  47.  
  48. static FILE    *fp;
  49.  
  50. /*
  51.  * noop
  52.  *
  53.  *    do nothing but return -1
  54.  */
  55. static int noop(void)
  56. {
  57.     return(-1);
  58. }
  59. /*
  60.  * PS_color
  61.  *
  62.  *    change the grey value of the ink
  63.  */
  64. static int PS_color(int col)
  65. {
  66.     curcol = col;
  67.     if (colour) {
  68.         curcol %= 256;
  69.         fprintf(fp, "%3.2f %3.2f %3.2f c\n", coltab[curcol].r, coltab[curcol].g, coltab[curcol].b);
  70.         return(0);
  71.     }
  72.  
  73.     if (col > 7)
  74.         return(0);
  75.  
  76.  
  77. #ifdef GREY_LINES
  78.     fprintf(fp, "%3.2f g\n", graymap[curcol]);
  79. #endif
  80.  
  81.     return(0);
  82. }
  83.  
  84. /*
  85.  * PS_mapcolor
  86.  *
  87.  *    Set our values in our pseudo colour map.
  88.  */
  89. static int PS_mapcolor(
  90.   int indx,
  91.   int r,
  92.   int g,
  93.   int b)
  94. {
  95.  
  96.     if (indx < 256 && indx >= 0) {
  97.         coltab[indx].r = r / 255.0;
  98.         coltab[indx].g = g / 255.0;
  99.         coltab[indx].b = b / 255.0;
  100.     }
  101.  
  102.     return(0);
  103. }
  104.  
  105. /*
  106.  * PS_common_init
  107.  *
  108.  *     Initialization that is common to both layouts
  109.  */
  110. static int PS_common_init(void)
  111. {
  112.  
  113.     vdevice.depth = colour ? 8 : 1;
  114.  
  115.     /*    Set other line drawing parameters    */
  116.  
  117.     fprintf(fp, "2 setlinewidth\n1 setlinejoin\n1 setlinecap\n");
  118.  
  119.     /*    Speed up symbol font handling    */
  120.  
  121.     fprintf(fp, "/sf /Courier findfont def\n");
  122.  
  123.     /*    Move    */
  124.  
  125.     fprintf(fp, "/m /moveto load def\n");
  126.  
  127.     /*    Draw    */
  128.  
  129.     fprintf(fp, "/d { lineto currentpoint stroke moveto } def\n");
  130.  
  131.     /*    Polygon Draw    */
  132.  
  133.     fprintf(fp, "/p /lineto load def\n");
  134.  
  135.     /*    Set character height    */
  136.  
  137.     fprintf(fp, "/h { sf exch scalefont setfont } def\n");
  138.  
  139.     /*    Show character string    */
  140.  
  141.     fprintf(fp, "/s /show load def\n");
  142.  
  143.     /*    Set gray scale    */
  144.  
  145.     fprintf(fp, "/g /setgray load def\n");
  146.  
  147.     if (colour) {
  148.         fprintf(fp, "/c /setrgbcolor load def\n");
  149.         coltab = (Coltab *)vallocate(256 * sizeof(Coltab));
  150.         PS_mapcolor(0, 0, 0, 0);
  151.         PS_mapcolor(1, 255, 0, 0);
  152.         PS_mapcolor(2, 0, 255, 0);
  153.         PS_mapcolor(3, 255, 255, 0);
  154.         PS_mapcolor(4, 0, 0, 255);
  155.         PS_mapcolor(5, 255, 0, 255);
  156.         PS_mapcolor(6, 0, 255, 255);
  157.         PS_mapcolor(7, 255, 255, 255);
  158.     }
  159.  
  160.     /*    Set a default font height    */
  161.     
  162.     fprintf(fp, "45 h\n");
  163.  
  164.     return(1);
  165. }
  166.  
  167. /*
  168.  * PS_init
  169.  *
  170.  *    set up the postcript environment. Returns 1 on success.
  171.  */
  172. static int PS_init(void)
  173. {
  174.     fp = _voutfile();
  175.  
  176.     if (!ps_first_time)
  177.         return(1);
  178.  
  179.     page = 1;
  180.     fputs("%!PS-Adobe-2.0 EPSF-1.2\n", fp);
  181.     fputs("%%BoundingBox: 74 96 528 728\n", fp);
  182.     fprintf(fp, "%%%%Page: %d %d\n", page, page);
  183.     fputs("%%EndComments\n", fp);
  184.     fprintf(fp, "72 300 div dup scale\n90 rotate\n400 -2200 translate\n");
  185.  
  186.     vdevice.sizeSy = 1890; 
  187.     vdevice.sizeSx = 2634; 
  188.     vdevice.sizeX = vdevice.sizeY = 1890; 
  189.  
  190.     PS_common_init();
  191.  
  192.     return (1);
  193. }
  194.  
  195. /*
  196.  * PSP_init
  197.  *
  198.  *    set up the postscript (Portrait) environment. Returns 1 on success.
  199.  */
  200. static int PSP_init(void)
  201. {
  202.     fp = _voutfile();
  203.  
  204.     if (!ps_first_time)
  205.         return(1);
  206.  
  207.     page = 1;
  208.     fputs("%!PS-Adobe-2.0 EPSF-1.2\n", fp);
  209.     fputs("%%BoundingBox: 72 96 526 728\n", fp);
  210.     fprintf(fp, "%%%%Page: %d %d\n", page, page);
  211.     fputs("%%EndComments\n", fp);
  212.  
  213.     fprintf(fp, "72 300 div dup scale\n300 400 translate\n");
  214.  
  215.     vdevice.sizeSy = 2634; 
  216.     vdevice.sizeSx = 1890; 
  217.     vdevice.sizeX = vdevice.sizeY = 1890; 
  218.  
  219.     PS_common_init();
  220.  
  221.     return (1);
  222. }
  223.  
  224. /*
  225.  * PS_exit
  226.  *
  227.  *    do a showpage and close the output file if neccessary.
  228.  */
  229. static int PS_exit(void)
  230. {
  231.     fputs("showpage\n", fp);
  232.     fputs("%%Trailer\n", fp);
  233.     fflush(fp);
  234.  
  235.     if (fp != stdout)
  236.         fclose(fp);
  237.  
  238.     /*
  239.      * Bug fix from brett@kirk.es.go.dlr.de (Bernward Bretthauer)
  240.      */
  241.     ps_first_time = 1;
  242.     drawn = 0;
  243.     curcol = 0;            /* black */
  244.     pslstx = pslsty = -1;
  245.     colour = 0;
  246.  
  247.     return(0);
  248. }
  249.  
  250. /*
  251.  * PS_draw
  252.  *
  253.  *    draw to an x, y point.
  254.  */
  255. static int PS_draw(
  256.   int x,
  257.   int y)
  258. {
  259.     if (pslstx != vdevice.cpVx || pslsty != vdevice.cpVy)
  260.         fprintf(fp, "%d %d m\n", vdevice.cpVx, vdevice.cpVy);
  261.  
  262.     fprintf(fp, "%d %d d\n", x, y);
  263.     pslstx = x;
  264.     pslsty = y;
  265.     drawn = 1;
  266.  
  267.     return(0);
  268. }
  269.  
  270. static int PS_pnt(
  271.   int x,
  272.   int y)
  273. {
  274.     fprintf(fp, "%d %d m\n", x, y);
  275.     fprintf(fp, "%d %d d\n", x, y);
  276.  
  277.     return(0);
  278. }
  279.  
  280.  
  281. /*
  282.  * PS_font
  283.  *
  284.  * load in small or large - could be improved.
  285.  */
  286. static int PS_font(char *font)
  287. {
  288.     if (strcmp(font, "small") == 0) {
  289.         vdevice.hwidth = 22.0;
  290.         vdevice.hheight = vdevice.hwidth * 1.833;
  291.         fprintf(fp, "%d h\n", (int)vdevice.hheight);
  292.     } else if (strcmp(font, "large") == 0) {
  293.         vdevice.hwidth = 35.0;
  294.         vdevice.hheight = vdevice.hwidth * 1.833;
  295.         fprintf(fp, "%d h\n", (int)vdevice.hheight);
  296.  
  297.     } else
  298.         return(0);
  299.  
  300.     return(1);
  301. }
  302.  
  303. /*
  304.  * PS_clear
  305.  *
  306.  *    flush the current page without resetting the graphics state of the
  307.  * laser printer.
  308.  */
  309. static int PS_clear(void)
  310. {
  311.     if (drawn) {
  312.         fprintf(fp, "gsave showpage grestore\n");
  313.         /* This is the end of the page, not of the document. */
  314.         /*  ralf@physik3.gwdg.de (Ralf Fassel) */
  315.         fputs("%%PageTrailer\n", fp);
  316.         page++;
  317.         fprintf(fp, "%%%%Page: %d %d\n", page, page);
  318.     }
  319.  
  320.     drawn = 0;
  321.  
  322.     return(0);
  323. }
  324.  
  325.     
  326. /*
  327.  * PS_char
  328.  *
  329.  *    output a character making sure that a '\' is sent first when
  330.  * appropriate.
  331.  */
  332. static int PS_char(char c)
  333. {
  334.     if (pslstx != vdevice.cpVx || pslsty != vdevice.cpVy)
  335.         fprintf(fp, "%d %d m\n", vdevice.cpVx, vdevice.cpVy);
  336.  
  337.     fprintf(fp, "(");
  338.  
  339.     switch(c) {
  340.     case '(':
  341.         fprintf(fp, "\\(");
  342.         break;
  343.     case ')':
  344.         fprintf(fp, "\\)");
  345.         break;
  346.     case '\\':
  347.         fprintf(fp, "\\");
  348.         break;
  349.     default:
  350.         fprintf(fp, "%c",c);
  351.     }
  352.  
  353.     fprintf(fp,") s \n");
  354.  
  355.     drawn = 1;
  356.     pslstx = pslsty = -1;
  357.  
  358.     return(0);
  359. }
  360.  
  361. /*
  362.  * PS_string
  363.  *
  364.  *    output a string one char at a time.
  365.  */
  366. static int PS_string(char *s)
  367. {
  368.     char    c;
  369.  
  370.     if (pslstx != vdevice.cpVx || pslsty != vdevice.cpVy)
  371.         fprintf(fp, "%d %d m\n", vdevice.cpVx, vdevice.cpVy);
  372.  
  373.     fprintf(fp, "(");
  374.     while ((c = *s++))
  375.         switch(c) {
  376.         case '(':
  377.             fprintf(fp, "\\(");
  378.             break;
  379.         case ')':
  380.             fprintf(fp, "\\)");
  381.             break;
  382.         case '\\':
  383.             fprintf(fp, "\\");
  384.             break;
  385.         default:
  386.         fprintf(fp, "%c",c);
  387.         }
  388.  
  389.     fprintf(fp,") s \n");
  390.     drawn = 1;
  391.     pslstx = pslsty = -1;
  392.  
  393.     return(0);
  394. }
  395.  
  396. /*
  397.  * PS_fill
  398.  *
  399.  *      fill a polygon
  400.  */
  401. static int PS_fill(
  402.   int n,
  403.   int x[],
  404.   int y[])
  405. {
  406.     int     i;
  407.  
  408.  
  409.     fprintf(fp, "newpath \n");
  410.  
  411.     fprintf(fp, "%d %d m\n", x[0], y[0]);
  412.  
  413.     for (i = 1; i < n; i++)
  414.         fprintf(fp, "%d %d p\n", x[i], y[i]);
  415.  
  416.     fprintf(fp, "closepath\n");
  417.  
  418.     if (!colour)
  419.         fprintf(fp, "%3.2f g\n", graymap[curcol]);
  420.  
  421.     fprintf(fp, "fill\n");
  422.  
  423.     if (!colour)
  424.         fprintf(fp, "0 g\n");
  425.  
  426.     vdevice.cpVx = x[n - 1];
  427.     vdevice.cpVy = y[n - 1];
  428.  
  429.     pslstx = pslsty = -1;        /* fill destroys current path */
  430.  
  431.     return(0);
  432. }
  433.  
  434. #ifndef VOGLE
  435. /*
  436.  * Set the line width...
  437.  */
  438. static int PS_setlw(int w)
  439. {
  440.     fprintf(fp, "%d setlinewidth\n", w * 2 + 1);
  441.  
  442.     return(0);
  443. }
  444.  
  445. /*
  446.  * Set the line style...
  447.  */
  448. static int PS_setls(int lss)
  449. {
  450.     unsigned ls = lss;
  451.     int    i, d, a, b, offset;
  452.  
  453.     if (ls == 0xffff) {
  454.         fprintf(fp, "[] 0 setdash\n");
  455.         return;
  456.     }
  457.  
  458.     fputc('[', fp);
  459.  
  460.     for (i = 0; i < 16; i++)    /* Over 16 bits */
  461.         if ((ls & (1 << i)))
  462.             break;
  463.  
  464.     offset = i;
  465.  
  466. #define    ON    1
  467. #define    OFF    0
  468.         
  469.     a = b = OFF;
  470.     if (ls & (1 << 0))
  471.         a = b = ON;
  472.  
  473.     d = 0;
  474.     for (i = 0; i < 16; i++) {    /* Over 16 bits */
  475.         if (ls & (1 << i))
  476.             a = ON;
  477.         else
  478.             a = OFF;
  479.  
  480.         if (a != b) {
  481.             b = a;
  482.             fprintf(fp, "%d ", d * 2 + 1);
  483.             d = 0;
  484.         }
  485.  
  486.         d++;
  487.     }
  488.  
  489.     fprintf(fp, "] %d setdash\n", offset);
  490.  
  491.     return(0);
  492. }
  493.  
  494. #else
  495. /*
  496.  * Set the line width...
  497.  */
  498. static int PS_setlw(int w)
  499. {
  500.     if (w == 0)
  501.         w = 2;
  502.     else if (w == 1)
  503.         w = 4;
  504.  
  505.     fprintf(fp, "%d setlinewidth\n", w);
  506.  
  507.     return(0);
  508. }
  509. #endif
  510.  
  511. static DevEntry psdev = {
  512.     "postscript",
  513.     "large",
  514.     "small",
  515.     noop,
  516.     PS_char,
  517.     noop,
  518.     PS_clear,
  519.     PS_color,
  520.     PS_draw,
  521.     PS_exit,
  522.     PS_fill,
  523.     PS_font,
  524.     noop,
  525.     noop,
  526.     PS_init,
  527.     noop,
  528.     PS_mapcolor,
  529. #ifndef VOGLE
  530.     PS_setls,
  531. #endif
  532.     PS_setlw,
  533.     PS_string,
  534.     noop,
  535.     noop
  536. };
  537.  
  538. /*
  539.  * _CPS_devcpy
  540.  *
  541.  *    copy the postscript device into vdevice.dev.
  542.  *